﻿#pragma once
#include "TradeApiSpi.h"
#include <string>
#include <list>
//#include "SymbolDetail.h"
#include "QueryData.h"
#include "TradeDetail.h"
#include "UsrTradeInterface.h"

class CTPTradeLib : public UsrTradeInterface
{
public:
	CTPTradeLib();
	~CTPTradeLib();

	// 初始化CTP 登录 验证等
	void Init();
	// 登出
	void Logout();
	// CTP阻塞
	void WaitForever();
	// 合约查询
	void QueryContracts();
	// 仓位查询
	void QueryPositions(const std::string &psymbol, QryData::QryBackFunc qryFunc = nullptr);
	// 账户查询
	void QueryAccount();
	// 成交查询
	void QueryTrades();
	// 账单查询 还未成功的账单撤销
	void QueryOrders();
	// 设置成交回报函数
	//void SetFeedbackFunc(TD::OrderBackFunc pTradeFeedFunc);
	// 判断仓位是否位空
	bool IsPositionEmpty(const std::string &pSymbol);
	// 返回请求错误标记 0没有错误
	int GetQueryError() { return m_requestError; }
	// 返回CTP连接状态
	bool GetCTPStatus() { return m_tradeSpi->GetAuthenticateSuc(); }
	
	// 市价下单 volumn为数目，小于0为做空，大于0为做多，0为平仓
	virtual void InsertOrderNow(const TD::OrderOption &pOption, TD::OrderBackFunc pBackFunc) override;
	// 返回仓位信息
	virtual bool GetPositionDetail(const std::string &pSymbol, QryData::Position &outPos) override;
	// 返回账户信息
	virtual const QryData::Account &GetAccountDetail()override { return m_account; }
	// 返回做单信息
	virtual bool GetOrderDetail(const std::string &pSymbol, TD::Order &outOrder) override;
	// 更新做单信息
	virtual bool UpdateOrderDetail(const std::string &pSymbol, const TD::Order &pOrder) override;
	// 移除做单信息
	virtual bool EraseOrderDetail(const std::string &pSymbol) override;
	// 返回所有的做单信息
	virtual const std::map<std::string, TD::Order> &GetAllOrderDetail() override {return m_orders;}
private:
	// 开仓
	void openOrderNow(const std::string &pSymbol, int volumn, int tickCount, float lastPrice);
	// 平仓
	void closeOrderNow(const std::string &pSymbol, int tickCount, float lastPrice);
	// 开平公用的函数
	void sendOrder(const std::string &pExchangeId, const std::string &pSymbol, int volumn, float orderPrice, TThostFtdcDirectionType pDir, char CombOffsetFlag);

	TradeApiSpi *m_tradeSpi;
	CThostFtdcTraderApi *m_api;
	int m_requestId;

	int m_requestError; // 请求错误标记，如果为负值，那么就是请求错误
	// 所有的持仓信息
	std::map<std::string, QryData::Position> m_symbolPOsition;
	QryData::Account m_account; // 账户信息
	// 记录下单信息
	std::map<std::string, TD::Order> m_orders;
	// 下单成功的回调
	TD::OrderBackFunc m_TradeFeedFunc;
};

